約 3,975,470 件
https://w.atwiki.jp/vst_prog/pages/91.html
トップページ CMidiMsgクラスの実装 ここでは前項で定義したCMidiMsgクラスについて説明する。 CMidiMsgクラスの実装 CMidiMsgクラスではコンストラクタでclearMidiMsg()関数を呼び出し初期化している。 clearMidiMsg()関数はメンバー変数に初期値を代入している。終了処理はないため、デストラクタでは何もしていない。 CMidiMsg CMidiMsg(void){clearMidiMsg();} CMidiMsg ~CMidiMsg(void){} void CMidiMsg clearMidiMsg(){// メンバー変数を初期化するcur=0;num=0;memset(buf, 0, sizeof(MidiMessage)*MIDIMSG_MAXNUM);} CMidiMsgクラス addMidiMsg()関数 次にaddMidiMsg()関数について説明する。 メンバ関数 戻り値 引数 内容 addMidiMsg() int VstMidiEvent *midievent MIDIメッセージをMIDIバッファへの保存する関数。引数は受け取るMIDIメッセージ(VstMidiEvent型のポインタ)MIDIバッファへの追加に成功すると1、失敗すると0が返る。 この関数はVSTから受け取ったMIDIメッセージをMIDIバッファへ保存するための関数で、processEvents()関数内で、下記のように呼び出されることを想定している。 VstInt32 MyMidiSample2VST processEvents (VstEvents* events){// MIDIバッファを初期化。clearMidiMsg(); int loops = (events- numEvents); // VSTイベントの回数だけループをまわす。for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばMIDIバッファに追加する。if ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]);if( !addMidiMsg(midievent) ){break;}}} // 1を返さなければならないreturn 1;} processEvents()関数内では、はじめにclearMidiMsg()関数でMIDIバッファ初期化している。 (clearMidiMsg()関数についてはコンストラクタの部分で説明したとおりである。) 次にVSTイベント(VstEvents* events)がいくつあるか確認し、VSTイベントの数だけ繰返し(for文)をおこない、VSTイベントがMIDIメッセージの場合にaddMidiMsg()関数を使用して、MIDIバッファへ保存している。 addMidiMsg()関数は下記のようにMIDIバッファに空きがあるかを確認し、空きがあればMIDIバッファに保管する。保管後は、MIDIバッファ内のMIDIメッセージ数を更新するようにしている。 また、VSTホストからMIDIメッセージを受け取る際はVstMidiEvent型で渡されることを想定し、簡単に処理できるようにaddMidiMsg()関数をオーバーロードしている。 int CMidiMsg addMidiMsg(VstMidiEvent *midievent){// VstMidiEventからMidiMessgeへデータをコピーするMidiMessage tmp;tmp.deltaFrames = midievent- deltaFrames;tmp.message = midievent- midiData[0] 0xF0;tmp.channel = midievent- midiData[0] 0x0F;tmp.data1 = midievent- midiData[1];tmp.data2 = midievent- midiData[2]; return addMidiMsg(tmp);} int CMidiMsg addMidiMsg(MidiMessage msg){// バッファがいっぱいなら0を返すif (num = MIDIMSG_MAXNUM)return 0; // バッファにMIDIメッセージを保存buf[num] = msg; // バッファに保存されているMIDIメッセージの数を増やす。num++;if (num MIDIMSG_MAXNUM) {num = MIDIMSG_MAXNUM;} return 1;} CMidiMsgクラス getMidiMsg()関数、getMidiMessageNum()関数、getNextDeltaFrames()関数 【作成中】 MIDIメッセージ処理用クラス定義 【作成中】 ここで作成するVSTサンプルのソースコード全体はここにある。 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/76.html
トップページ VSTクラスの初期化 ここでは前項で定義したMyMidiSampleVSTの初期化を行う。 VSTとしての最低限の初期化を行うとともに以下2つのMIDIに関するメンバー変数を初期化する。 midimsgnum … 受け取ったMIDIメッセージの数。0に初期化しておく midimsgbuf[ ] … 受け取ったMIDIメッセージを保管するバッファ。バッファすべてを0に初期化しておく サンプルコード サンプルコードは以下のとおり。 MyMidiSampleVST MyMidiSampleVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行うmidimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); volume = 1.0f;} サンプルコードの解説 まず2行目~17行目でVSTの初期化を行っている。(詳細はVST初期化ルールのとおり) なお、Synthとして動作させるため、isSynth()関数にtrueを引き渡している。 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 次に19~20行目で2つのMIDIに関するメンバー変数を初期化している。 midimsgnum = 0; memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/93.html
トップページ VST GUIの作成 一定間隔でGUIの描画更新するサンプル。 テキストラベルを表示するサンプルをもとにしている。 テキストラベルを表示するサンプルからの追加内容としては以下のとおり。 idle()関数(100ミリ秒ごとに呼び出される関数)をオーバーライド idle()関数の中にカウンタを用意し、呼び出されることにカウントアップし描画する。 なお作成したVSTは以下のとおり。(DLLファイルを利用するときはウィルスチェックをかけてください) ダウンロード サンプルコード全体 【MyGuiVst5.cpp】 #define _CRT_SECURE_NO_DEPRECATE 1 #include stdio.h #include stdlib.h #include string.h #include math.h #include windows.h #include "audioeffectx.h"#include "vstcontrols.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_VENDOR "test vendor" //作者(ベンダー)名#define MY_VST_VERSION 1 //このVSTバージョン#define MY_VST_PRODUCT_NAME "Sample VST GUI" //このVSTの製品名#define MY_VST_NAME "GUI" //このVSTの名前 #define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2#define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID SMPL //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 2 //パラメータの数 #define MYVST_VOLUME_L 0#define MYVST_VOLUME_R 1// ============================================================================================// VST GUIクラス// ============================================================================================class VstGui5 public AEffGUIEditor, CControlListener{public VstGui5 (void* effect);virtual ~VstGui5 (); // GUIのWindowを開いたときと閉じたときに処理を行う関数virtual bool open (void *ptr);virtual void close (); // 他の処理がアイドル状態の際に呼び出される関数// GUI描画の更新等を行う。// おそらく100ミリ秒ごとに呼び出される。virtual void idle (); // ボタンやつまみ等が動かされたときに処理を行う関数// 今回はテキストラベルのみのため、処理すべきことはないが、// valueChanged()関数は必ずオーバーライドしなければならない。virtual void valueChanged (CDrawContext *pContext, CControl *pControl) {}; protected // テキストラベルCTextLabel* textLabel;}; VstGui5 VstGui5 (void* effect) AEffGUIEditor ((AudioEffect*)effect){// 継承元のにあるrect変数を初期化。// このrect変数にGUIのWindowsサイズを設定する。// (設定を行わないとWindowが開けない)rect.left = 0;rect.top = 0;rect.right = 512;rect.bottom = 256;} VstGui5 ~VstGui5 (){} bool VstGui5 open (void *ptr){// まずは継承元の関数を呼び出す(必須)AEffGUIEditor open (ptr); // 次にフレーム(CFrame)を作成する。// ボタンやつまみ等はこのフレームの上に配置する形になる// ここではWindowと同じサイズのフレームを作成しているCRect size (rect.left, rect.top, rect.right, rect.bottom); CFrame* cframe = new CFrame (size, ptr, this);// 作成したフレームは継承元にあるframe変数に値を保存する必要がある。this- frame = cframe; // -----------------------------------------------------------------// テキストラベルの大きさを設定 CRect textsize (0, 0, 80, 25); // テキストラベルの位置を設定textsize.offset (16, 16); // テキストラベルを作成textLabel = new CTextLabel(textsize, "TextLabel", NULL, kLeft); // テキストラベルをframeに追加するframe- addView (textLabel); // 処理に問題がなければtrueを返すreturn true;} void VstGui5 close (){// frameをdeleteすることを忘れないようにするif (frame){delete frame;}frame = 0;} void VstGui5 idle (){// まずは継承元の関数を呼び出す(必須)AEffGUIEditor idle (); // このVSTGUI固有の処理を記載する static int i = 0;char text[256]; sprintf_s(text, 256,"%d", i); //テキストラベルの文字を設定するtextLabel- setText (text); // テキストラベルの描画を更新するtextLabel- setDirty(); i++;} // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyVstGui5 public AudioEffectX{public MyVstGui5 (audioMasterCallback audioMaster);~MyVstGui5 (); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyVstGui5 (audioMaster);} // ============================================================================================// コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)// ============================================================================================MyVstGui5 MyVstGui5 (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 // GUIを設定するeditor = new VstGui5(this); //このVSTのパラメータを初期化する。} MyVstGui5 ~MyVstGui5 (){//VSTの終了処理をする。//このVSTでは特に実行する処理はなし。 // GUIはdeleteしなくていいっぽい} // ============================================================================================// 音声信号を処理するメンバー関数// ============================================================================================void MyVstGui5 processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){float *inL = inputs[0]; //入力 左用float *inR = inputs[1]; //入力 右用float *outL = outputs[0]; //出力 左用float *outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames ; i++){// 入力をそのまま出力へoutL[i] = inL[i];outR[i] = inR[i];}} VST Tipsトップページへ(準備中)
https://w.atwiki.jp/vst_prog/pages/77.html
トップページ MIDIメッセージをホストアプリケーションから受け取る関数 MIDIメッセージをホストアプリケーションから受け取るにはprocessEvents()関数を利用する。 processEvents()関数 VstInt32 processEvents (VstEvents* events) 戻り値と引数については以下のとおりである。 戻り値(型) 説明 VstInt32 戻り値についてはホストアプリケーションで無視される。ただし、念のため1を返すようにするとよい。 引数 説明 VstEvents* events イベントを保持しているVstEvents型変数(後述)へのポインタ processEvents()関数はMIDIメッセージだけを受け取る関数ではなく、VSTに関するホストアプリケーションからのイベントをすべて受け取る関数となっている。 ただし、実装されているメッセージは現在(2010年11月)のところMIDIに関する以下の2つだけである。 MIDIメッセージ MIDI System Exclusiveメッセージ processEvents()関数との関係 ホストアプリケーションはprocessReplacing()関数を呼び出す前に必ず1度だけprocessEvents()関数呼び出し、イベントをVSTに通知する。 また、processEvents()関数で渡されるイベントは直後に呼び出すprocessReplacing()関数に関連するイベントのみとなっている。 ホストアプリケーション側の処理のイメージとしては以下のような感じである。 【ホストアプリケーションの動作】 ①processEvents()関数呼び出し ↓ ②processReplacing()関数呼び出し ↓ ③いろいろ処理 ↓ ④processEvents()関数呼び出し ↓ ⑤processReplacing()関数呼び出し ↓ ⑥いろいろ処理 ↓ ⑦processEvents()関数呼び出し ↓ ⑧processReplacing()関数呼び出し ↓ : : ホストアプリケーションは①でprocessEvents()関数を呼び出した際に、②processReplacing()関数に関連するイベントのみをVSTに渡す。 (ホストアプリケーションは②に無関係のイベント(⑤や⑧に関連するイベント)については渡してはいけない。) サンプルコード processEvents()関数でMIDIメッセージを保存するサンプルコードは以下のとおり。 VstInt32 MyMidiSampleVST processEvents (VstEvents* events){// MIDIのリストを初期化します。midimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); // VSTイベントの回数だけループをまわす。int loops = (events- numEvents);for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]); midimsgbuf[midimsgnum].deltaFrames = midievent- deltaFrames;midimsgbuf[midimsgnum].message = midievent- midiData[0] 0xF0; // MIDIメッセージmidimsgbuf[midimsgnum].channel = midievent- midiData[0] 0x0F; // MIDIチャンネルmidimsgbuf[midimsgnum].data1 = midievent- midiData[1]; // MIDIデータ1midimsgbuf[midimsgnum].data2 = midievent- midiData[2]; // MIDIデータ2midimsgnum++; // MIDIメッセージのバッファがいっぱいの場合はループを打ち切る。if (i = MIDIMSG_MAXNUM){break;}}} // 1を返しておくreturn 1;} サンプルコードの解説 まず引数のVstEvents構造体は以下のように定義されている。 変数 型 説明 numEvents VstInt32 VSTイベントの数。 reserved VstIntPtr 使われていない変数。0で固定 events [2] VstEvent * VSTイベントへのポインタ。numEvents分だけVSTイベントが格納されている。 ホストアプリケーションからのVSTイベント自体は上記のVstEvents構造体のVstEvent * events[]に格納されている。 VstEvent構造体は以下のように定義されている。 変数 型 説明 type VstInt32 VSTイベントのタイプ。実装されているタイプは以下の2つのみ。kVstMidiType…data[ ]に保存されているデータがMIDIメッセージであることを示すkVstSysExType…data[ ]に保存されているデータがMIDI System Exclusiveメッセージであることを示す byteSize VstInt32 VstEvent構造体のtypeとbyteSizeを除いたバイト数。24固定。 deltaFrames VstInt32 processReplacing()関数内でMIDIメッセージの処理タイミング。0~sampleFramesの範囲の値を持つ。 flags VstInt32 使われていない変数。 data[16] char 実際のVSTイベントデータ。typeよって内容が変わる。 サンプルコードでは、最初にMIDIメッセージを保存するバッファを初期化している。(3~5行目) midimsgnum = 0; memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); 次にVSTイベントの数だけ処理するループを作成している。(8~29行目) // VSTイベントの回数だけループをまわす。 int loops = (events- numEvents); for (int i = 0;i loops; i++) { : : } ループの中で与えられたVSTイベントがMIDIメッセージか確認し、MIDIメッセージならばバッファに保存する(12~28行目) バッファに保存する際、VstEvent構造体のままでは扱いにくいため、VstMidiEvent構造体(後述)に型変換している。 if ((events- events[i])- type == kVstMidiType) { VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]); midimsgbuf[midimsgnum].deltaFrames = midievent- deltaFrames; midimsgbuf[midimsgnum].message = midievent- midiData[0] 0xF0; // MIDIメッセージ midimsgbuf[midimsgnum].channel = midievent- midiData[0] 0x0F; // MIDIチャンネル midimsgbuf[midimsgnum].data1 = midievent- midiData[1]; // MIDIデータ1 midimsgbuf[midimsgnum].data2 = midievent- midiData[2]; // MIDIデータ2 midimsgnum++; } VstMidiEvent構造体については以下のように定義されている。 変数 型 説明 type VstInt32 VstEvent構造体と同じ。 byteSize VstInt32 VstEvent構造体と同じ。 deltaFrames VstInt32 VstEvent構造体と同じ。 flags VstInt32 使われていない変数。 noteLength VstInt32 用途不明 noteOffset VstInt32 用途不明 midiData [4] char MIDIメッセージ。midiData[0]…MIDIステータス(メッセージ)とMIDIチャンネルが入っている。midiData[1]…MIDIメッセージのデータ1midiData[2]…MIDIメッセージのデータ2midiData[3]…将来的な拡張のため予約。0が入っている。 detune char 用途不明。-64~+63の値が入っている。 noteOffVelocity char 用途不明。0~127の値が入っている。 reserved1 char 将来的な拡張のため予約。0が入っている reserved2 char 将来的な拡張のため予約。0が入っている 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/erabuyoudesu/pages/71.html
\\. . . . . .| i i i i i i i i 此ア¨7ヒ二二‐‐‐=⇒' __- ̄ _\\\... ....| i i i i i i _j㌢ _,ィ化二二二‐⇒ __-ニ二_ __,,.., ''´|. ..\\\\i i i i i i iア ノ'´ _、rセ7ア二- __‐二ΞΞ‐ ̄ 〔__ ‐ニ ̄.|. . . ..\\\\_/ ノ′ ⌒ニ=--==ニ二Ξ─ ___--二二三三三三..|. . . . . i\\\__彡 /二二二ニ- _-二三三三三三二二二三...|. . . . ..i| i \____,.。s≦三二二ニニ∧∧二∧二‐‐二二二‐ ‐ニ....|. . ... ...i|i i i i i j愀抖些三ニニ∧∧ / ∨ |\----二- -二.....|. . . . . i|..i i i..j愀批|i比- ∧/ ∨ | | \二二‐ _‐二二-─ 、---ミ i i i j愀批]|ヘ,二| |i | | /|∧ ニ=-‐ァ…‐ } \ . )i i j愀批ミ| \| |i | /| / | |`丶、 / _;_ }'´|i i j愀批iヒj| |\ |\ | |/ | / | /| 、、 \-__'´ { `ヽノ. ..|i .i愀批ヒハ| |i \| \ | \ / |/ / /,i|ミ{{心、 \ニ _;_ \..|i..愀i批i/ |i, i|i \ 从 Υ / / /洲 }ヘ}}沁, んじゃあ、まぁ───いっちょやるか!!!'´ { `ヽ } |i 愀批//´込, i|乂__j「´'ーァァァ小ーrー< `j州| {ニヤ}沁, { \ | {{批{{{ {二}lY^寸辷i「 //{ / ハ ハ | | } jノり }ニi川沁,..,,___、___ } {{批{i{ }ニ}il{ }√ _,,_ { { { { { } | | | | lx-j{ {二|州州i { { {  ̄`'芍矧 }二}i|i,└{i ー--ミ{ { {八{ } | |ル必'´j{ た j愀洲}{_ ゝ __,_ }矧 {二}派 〉 、,_,_,刈㎞\jルィツノ j{ ∨ニj愀洲j{丁'<//込¨¨´Ⅶi叭二{ \i{ノ '^^彡'^7^ ^i^¨丶` j{ . }二,妣洲j{′ | |^'弌 }i 、 寸i沁,-{. . . 八 . / i\ / か/ニ/}}}/ / | | >-、 \}i}\. . / \ } /__\{__}_,〉,, / /ニ,ニ/}}i/ // ‘, ‘, |_ トミ\}}}\. . . i i ゙i, /トVv--vV/ ./. . /二/ニ}}]/ / //. .‘, ‘, √| |__ |`'iヘ批) 。,. i i i 、``' ー‥‐'゙ ; /i i ,;化 アΞ{{/ / //. . ‘, ‘, | |┘ || | Vヒ三 /⌒\___/i i ィ狄ア三‐,妣ニ‐/ 〉. . . ‘, ‘, | |__|| | ∨/ /^\ \ニ=--=ニ⌒/三‐,妣批i/ 〉-. . . . . ヽ ヽ弋__] | 〈、く //二ニ=--=彡三ニ,妣批/_/_. . . . . . . . \ \ | ‘,\\ /弌三三三‐/三二,;化7⌒刈///. . . . . . . .∨,\ .,__ノ∧ . ∨) イ批批}h守三ア三二,;化ア. . . . . . \/. . . . . . . . .∨'/,\ / /〉 ∨ニ | |`'弌批}}h守二=-_彡'′. . . . . . . . ∨. . . . . . . . . ∨///>-<//∧ ∨ | |二ニ`'弌批「T=-<. . . . . . . . . . . . . . ',. . . . . . . ∨//////////∧ ∨三二二二ニ/ /. . . . . .\ニ=- ___∧. . . . . . . . ∨//////////∧ ∨-=ニ二三//. . . . . . . . . \ニ/ ̄ ̄/∧. . . . . . . . ∨//////////∧ ∨/ . . ー<. . . . . . . . . . . . . . \ . .三∧. . . . . . . . ∨//////////∧ ‘,`` '´. . . .\ニ=- ..,,__|≧=‐三/∧. . . . . . . . ∨//////////∧ ∨. . . . . . . . . . \三/ ̄ ...... ∨三∧. . . . . . . . ∨//////////∧ ゙,. . . . . . . . . . . ∨ ... _-二┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ 【魔剣教団上級騎士:竜殺しのガッツ】 ガッツ・シンセシス・スリー LV:120 装備 ・武器?? ・防具?? ・アクセ1?? ・アクセ2?? □スキル ・??? ・??? ・始解:??? ・卍解:??? □自動スキル(*1) ・超越者:超越者以外の装備効果によるステータス補正を無視する(スキル枠消費無し) ・ベルセルク:炎上、凍結、感電、忘却、目眩、睡眠、混乱、恐怖、絶望、激怒、洗脳のダメージ及び効果を無視して行動できる。 上記の状態異常効果1つに付き全ステータスを10%上昇する。代わりに他者からの回復魔法及び、回復効果を受け付けない。 ・??? ・??? ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 経歴 フォルトゥナの魔剣教団の一員。上級騎士の中では、かなり常識的で苦労人気質(中間管理職)。 10年ほど前に記憶を失ったアリスを保護して魔剣教団傘下の孤児院へと送った。 愛染の起こした事件では、ナイトブレイザーを悪魔に、また悪魔をナイトブレイザーと思うように完全催眠を受けていた。催眠が解除されてから思い出すと自殺しかねないのでマーリン・シンセシス・エイトに経過観察されている。 またギントキ・シンセシス・フォーの下剋上により敗北した。(順位が変動したものと思われる) 登場人物
https://w.atwiki.jp/vst_prog/pages/58.html
VST Tips(準備中) VSTを作るにあたって VSTを作るにあたって、いくつかの事項を決めておくとよい。 VST基本情報の決定 エフェクターを設計する前に以下の項目を決めておくとよい。 項目 説明 例 作者(ベンダー)名 作成した人や会社の名前半角英数63文字以内 VSTバージョン 作成するVSTのバージョン(32ビット整数で表せるように) 1.0.0 (32ビット整数で100にする)120100401 等 VSTの製品名 VSTの製品名半角英数63文字以内 DelayDistortion 等 VSTの名前 VSTの名前。半角英数31文字以内 (VSTの製品名と何が違うのかは不明。文字数に問題がなければVSTの製品名と同じでよい。) 入力の数 エフェクターの入力の数 モノラルの場合…1ステレオの場合…2 出力の数 エフェクターの出力の数 モノラルの場合…1ステレオの場合…2 ユニークID VSTを区別するためのID作成したVSTを公開する場合は以下URLで登録を行い、発行されたユニークIDを入力する。http //ygrabit.steinberg.de/~ygrabit/public_html/index.html プリセットの数 プリセットプログラムの数 以下のプリセットプログラムを持つディレイの場合…3- Long Delay- Short Delay- Cross Delay パラメータの数 Hostプログラム(Cubase、Sonarなど)がコントロールできるパラメータの数(パラメーターに関してはさらに設計の必要がある(後述)) 以下のパラメータを持つディレイの場合…4- Delay Type- Delay Time- Feedback Level- Delay Level パラメーター情報の決定 各パラメーターごとに以下の項目を決めておくとよい 項目 説明 パラメーター名 パラメーターの名前半角英数8文字 表示方法 パラメーターの値をどう表示するか(整数で表示するのか?文字列で表示するのか? 等)半角英数8文字 単位 パラメーターの単位半角英数8文字 範囲 パラメータのとりうる範囲 デフォルト値 パラメータのデフォルトの値 例:Delayの場合 No. パラメーター名 表示方法 単位 範囲 デフォルト値 0 Type ディレイタイプ(文字列) なし mono,stereo,cross stereo 1 Time ディレイタイム(小数点表示) ms 100~1000 500 2 Feedback フィードバック量(小数点表示) % 0~100 30 3 Level 出力音量(小数点表示) % 0~100 25 その他設計 作成するVSTにあわせて、アルゴリズムや内部変数等の設計についても決めておくとよい。 例: どのようなアルゴリズムで実装するか? 内部で使用する変数はどうするか? 等 VST Tipsトップページへ(準備中) 同一カテゴリのTips 項目 No. 概要 VSTの設計 No.1 VSTを作成するに当たって事前に設計しておくとよいことの一覧
https://w.atwiki.jp/vst_prog/pages/74.html
トップページ MIDIメッセージ処理 MIDIメッセージにあわせて動作するVSTのサンプルである。 下記VSTはSynthとしてロードされ、常にノイズを発生させる。実行時は音量に注意してほしい。 ノイズのボリュームをMIDI CC7でコントロールできる。 サンプルコード全体 ソースコードのダウンロード→ここをクリック // ============================================================================================// インクルードファイル// ============================================================================================#include stdlib.h #include string.h #include "audioeffectx.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2#define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID SMPL //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 0 //パラメータの数 // ============================================================================================// MIDI処理用の定義// ============================================================================================#define MIDIMSG_MAXNUM 255 struct MidiMessage{VstInt32 deltaFrames; //MIDIメッセージを処理するタイミングunsigned char message; //MIDIメッセージ番号unsigned char channel; //MIDIチャンネルunsigned char data1; //MIDIデータ1unsigned char data2; //MIDIデータ2}; // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyMidiSampleVST public AudioEffectX{protected int midimsgnum; //受け取ったMIDIメッセージの数MidiMessage midimsgbuf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファ // ノイズのボリュームfloat volume;public MyMidiSampleVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数VstInt32 processEvents (VstEvents* events);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyMidiSampleVST (audioMaster);} MyMidiSampleVST MyMidiSampleVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行うmidimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); volume = 1.0f;} void MyMidiSampleVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 // midieventlistの読み込み位置int midimsg_cursol = 0; for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。 // MIDIメッセージがあるか確認if ( midimsgnum 0){// MIDIメッセージを処理するタイミングかどうかを確認する。if( midimsgbuf[midimsg_cursol].deltaFrames = i){// MIDIメッセージがコントロールチェンジのボリューム変更(CC7)であった場合if( midimsgbuf[midimsg_cursol].message == 0xB0 midimsgbuf[midimsg_cursol].data1 == 7){volume = (float)( midimsgbuf[midimsg_cursol].data2) / 127.0f;} // midimsgbufからMIDIメッセージを読み出したので// 読み込み位置を進め、MIDIメッセージの数を減らすmidimsgnum--;midimsg_cursol++;}} //出力バッファへ書き込む。outL[i] = volume * (float)((rand() % 256) -128) / 255.0f;outR[i] = volume * (float)((rand() % 256) -128) / 255.0f;}} // MIDIメッセージを処理するメンバー関数// processReplacing()の前に必ず1度だけ呼び出される。// VstInt32 MyMidiSampleVST processEvents (VstEvents* events){// MIDIのリストを初期化します。midimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); // VSTイベントの回数だけループをまわす。int loops = (events- numEvents);for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]); midimsgbuf[midimsgnum].deltaFrames = midievent- deltaFrames;midimsgbuf[midimsgnum].message = midievent- midiData[0] 0xF0; // MIDIメッセージmidimsgbuf[midimsgnum].channel = midievent- midiData[0] 0x0F; // MIDIチャンネルmidimsgbuf[midimsgnum].data1 = midievent- midiData[1]; // MIDIデータ1midimsgbuf[midimsgnum].data2 = midievent- midiData[2]; // MIDIデータ2midimsgnum++; // MIDIメッセージのバッファがいっぱいの場合はループを打ち切る。if (i = MIDIMSG_MAXNUM){break;}}} // 1を返しておくreturn 1;} VST Tipsトップページへ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/24.html
Steinberg VST Audio Plug-Ins SDK 2.4のインストール方法(2010年4月14日) Visual C++へのパス追加 Visual C++のオプション設定 Visual C++を起動し、メニューから「ツール」→「オプション」を選択 Visual C++へのパス追加 開いたオプションダイアログの左側で「プロジェクトおよびソリューション」→「VC++ ディレクトリ」を選択。 右側の「ディレクトリを表示するプロジェクト」を「インクルードファイル」にする。 フォルダマークを押し、新しい行を追加する。 その後、新しい行の右側「...」を押す 開いたダイアログで以下のフォルダを選択する。(VST SDK 2.4をC \以外に保存している場合はその場所を指定する) C \vstsdk2.4 同様の手順で以下2つのフォルダを追加する。 C \vstsdk2.4\vstpublic.sdk\sorce\vst2.x C \vstsdk2.4\pluginterface\vst2.x C \vstsdk2.4\vstgui.sf\vstgui 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/89.html
VST Tips(準備中) MySynthSampleVSTクラスの実装 ここでは音源に必要なクラスの定義で定義したMySynthSampleVSTクラスについて説明する。 MySynthSampleVSTの初期化 MySynthSampleVSTの初期化では初期化ルールに従い初期化を行っている。 MySynthSampleVST MySynthSampleVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行う} ただし、作成するものが音源(VSTi)のためisSynth()関数の引数にtrueを入れている。 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false MIDIメッセージをホストアプリケーションから受け取る processEvents()関数でMIDIメッセージを受け取る。 詳細については省略する。(詳しくはMIDIメッセージをホストアプリケーションから受け取る関数参照) 受け取ったMIDIメッセージの振り分け 受け取ったMIDIメッセージをメッセージごとに処理を振り分ける。 今回の音源のMIDI Controllerにあたる部分となる。 実装についてはCMidiMsgクラスからオーバーライドしたMidiProc()関数が該当する。 詳細については省略する。 MIDI ノードOn/Offメッセージを受け取った時の処理 今回の音源のVoice Controllerにあたる部分を実装する。 今回の音源の仕様で記述したとおり、ノートOnメッセージを受け取った場合、まず停止中(OFF状態)のボイスを探す。 停止中のボイスが見つかれば、そのボイスを発音(start)させ、停止中ボイスの検索を打ち切る。 void MySynthSampleVST onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo){// OFF状態のボイスを探すfor(int i = 0; i MAX_VOICES; i++){if(cvoice[i].getStatus() == VOICE_STATE_OFF){// OFF状態のボイスをONにして検索終了cvoice[i].start(noteNo);break;}}} なお、上記のコードはすべて発音中の場合、それ以上音が出ないという不具合(仕様)がある。(この仕様の修正についてはそのうち説明予定。) 次にノートOnメッセージを受け取った場合であるが、これは発音中(ON状態)かつ音程(ノートナンバー)が一致するものを探し出し、見つかればそのボイスを停止(stop)させるという処理を実施している。 void MySynthSampleVST onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo){// ON状態でかつノートNoと一致するボイスを探すfor(int i = 0; i MAX_VOICES; i++){if(cvoice[i].getStatus() == VOICE_STATE_ON cvoice[i].getNoteNo() == noteNo){// ON状態のボイスをOFFにして検索終了cvoice[i].stop();break;}}} processReplacing()関数 作成中 次へ(準備中) 同一カテゴリのTips 項目 No. 概要
https://w.atwiki.jp/vst_prog/pages/70.html
VST Tips(準備中) 最小構成のVST ここでは最小構成のVSTを作成する方法について記載する。 最小構成のVSTを作成するには以下の2点を行えば、VSTとして読み込めるものが完成する。 AudioEffectXクラスを継承した自作クラスの作成 自分で作ったVSTクラスを呼び出すAudioEffect* createEffectInstance()関数の作成 なお、ここで作成するVSTサンプルのソースコード全体はここにある。 AudioEffectXクラスを継承した自作VST用クラスの作成 まず基本として、VSTはAudioEffectXクラスを継承して作らなければならない。 AudioEffectXクラスは「vstsdk2.4\public.sdk\source\vst2.x\audioeffectx.h」で定義されている。 AudioEffectXクラスを継承して作った自作クラスは、以下の2つの関数を持たなければならない。 コンストラクタ …自作VSTの初期化を行う。初期化にはルールがある(後述)。 void processReplacing() …音声の処理を行う関数。AudioEffectXクラスから継承する。 具体的には以下のようになる。 // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyMinimumVST public AudioEffectX{public MyMinimumVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);}; AudioEffect* createEffectInstance()関数の作成 次に、ホストアプリケーション(Cubase,Sonar等)が自作VSTのインスタンスを作成するために必要な関数を作成しなければならない。 なぜこのような関数が必要かの詳細は説明できるほどの知識がないため省略する。(どうもDLLファイルはC++のクラスをエクスポートできないらしい。苦肉の策としてこのような関数がある模様。) 自作VSTのインスタンスをnewで生成してreturnで返すだけでよい。 // ============================================================================================// 自作VSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyMinimumVST (audioMaster);} 自作VSTクラスの初期化方法、音声処理部分の説明については次項で説明する。 次へ 同一カテゴリのTips 項目 No. 概要 最小構成のVST No.1 最小構成の自作VSTに必要な関数等の説明。 No.2 最小構成の自作VSTの必須初期化項目について No.3 最小構成の自作VSTの音声処理関数について No.4 最小構成の自作VSTのサンプルソースコード全体